package com.indusfo.spc.controller;

import com.indusfo.spc.pojo.ExcelErrorData;
import com.indusfo.spc.pojo.RuleDetail;
import com.indusfo.spc.service.RuleDetailService;
import com.indusfo.spc.untlis.ExcelUtil;
import com.indusfo.spc.untlis.GsonUtil;
import com.indusfo.spc.vo.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author chenm
 * @create 2019-07-23 14:17
 */
@RequestMapping("/service/ruleDetail")
@Controller
public class RuleDetailController {

    @Resource
    private RuleDetailService ruleDetailService;

    /**
     * 查询
     * @param ruleDetail
     * @return
     */
    @RequestMapping("/queryRuleDetail")
    @ResponseBody
    public JSONObject queryRuleDetail(RuleDetail ruleDetail){
        JSONObject json = ruleDetailService.queryRuleDetail(ruleDetail);
        return json;
    }


    /**
     * 新增
     */
    @RequestMapping("/insertRuleDetail")
    @ResponseBody
    public JSONObject insertRuleDetail(RuleDetail ruleDetail){
        JSONObject json = ruleDetailService.insertRuleDetail(ruleDetail);
        return json;
    }

    /**
     * 停用启用
     */
    @RequestMapping("/definedRuleDetail")
    @ResponseBody
    public JSONObject definedRuleDetail(Integer[] ruleDetailIds, Integer  dataState){
        JSONObject json = ruleDetailService.deleteRuleDetail(ruleDetailIds,dataState);
        return json;
    }

    /**
     * 删除
     */
    @RequestMapping("/deleteRuleDetail")
    @ResponseBody
    public JSONObject deleteRuleDetail(Integer[] ruleDetailIds, Integer  dataState){
        dataState = 2;
        JSONObject json = ruleDetailService.deleteRuleDetail(ruleDetailIds,dataState);
        return json;
    }

    /**
     * 修改
     */
    @RequestMapping("updateRuleDetail")
    @ResponseBody
    public JSONObject updateRuleDetail(RuleDetail ruleDetail){
        JSONObject json = ruleDetailService.updateRuleDetail(ruleDetail);
        return json;
    }

   /**
    * @Author 熊冰 排序
    * @Date 2020/3/9 11:33
    */
    @RequestMapping("sortRuleDetail")
    @ResponseBody
    public JSONObject sortRuleDetail(Integer[] ruleDetailiIds){
        JSONObject json = ruleDetailService.sortRuleDetail(ruleDetailiIds);
        return json;
    }

    @RequestMapping("/uploadFileRuleDetail")
    @ResponseBody
    public JSONObject uploadFileRuleDetail(@RequestParam("file") MultipartFile file, Boolean way, HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException {

      //定义一个JSONObject对象用于向前台传输数据
        JSONObject jsonObject = new JSONObject();
        jsonObject.setStatus(JSONObject.SUCCESS);
        //设置错误集合的
        List<ExcelErrorData> errorDatas = new ArrayList<>();
        response.setContentType("text/html;charset=UTF-8");
        //判断上传文件格式是否正确
        Workbook wb = ExcelUtil.getWorkbook(file.getInputStream(), ExcelUtil.isExcel2007(file.getOriginalFilename()));
        if (wb == null) {
            errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "文件解析错误"));
            jsonObject.setStatus(JSONObject.ERROR);
            jsonObject.setMsg("文件解析错误");
        } else {
            //获取excel文件的第一个sheet
            Sheet sheet = wb.getSheetAt(0);
            if (sheet == null) {
                jsonObject.setStatus(JSONObject.ERROR);
                jsonObject.setMsg("未找到需要导入的表格");
                errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "未找到需要导入的表格"));
            } else {
                //获取最后一行的行号
                int rowCount = sheet.getLastRowNum();
                if (rowCount < 1) {
                    jsonObject.setStatus(JSONObject.ERROR);
                    jsonObject.setMsg("未找到需要导入的数据，请确认表格是否保存！！！");
                    errorDatas.add(ExcelErrorData.getExcelErrorData(0, "未找到需要导入的数据，请确认表格是否保存！！！"));
                } else {
                    List<RuleDetail> addProductPlans = new ArrayList<>();
                    for (int i = 1; i <= rowCount; i++) {
                        boolean needAdd = true;
                        //获取到每一行的每一列的数据
                        //条码规则类别名称
                        String ruleName =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 0, false);
                        //类型名称
                        String type = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 1, false);
                        //日期格式
                        String ruleFormatName =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 2, false);

                        //常量初始值
                        String charValue =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 3, false);

                        //数值初始值
                        String numValueStr =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 4, false);
                        Integer numValue=null;
                        if(!StringUtils.isEmpty(numValueStr)){
                            if(StringUtils.isNumeric(numValueStr)){
                                numValue=Integer.valueOf(numValueStr);
                            }
                        }
                        //数值长度
                        String numLengthStr = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 5, false);
                        Integer numLength=null;
                        if(!StringUtils.isEmpty(numLengthStr)){
                            if(StringUtils.isNumeric(numLengthStr)){
                                numLength=Integer.valueOf(numLengthStr);
                            }
                        }
                        //数值步长
                        String numStepStr = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 6, false);
                        Integer numStep=null;
                        if(!StringUtils.isEmpty(numStepStr)){
                            if(StringUtils.isNumeric(numStepStr)){
                                numStep=Integer.valueOf(numStepStr);
                            }
                        }
                        //变量参数
                        String variateFormatName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 7, false);
                        //变量格式
                        String variateTypeName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 8, false);//变量格式
                        //变量起始值
                        String startNumStr = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 9, false);//变量格式
                        Integer startNum=null;
                        if(!StringUtils.isEmpty(startNumStr)){
                            if(StringUtils.isNumeric(startNumStr)){
                               startNum= Integer.valueOf(startNumStr);
                            }
                        }
                        //变量结束值
                        String endNumStr = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 10, false);
                        Integer endNum=null;
                        if(!StringUtils.isEmpty(endNumStr)){
                            if(StringUtils.isNumeric(endNumStr)){
                                endNum= Integer.valueOf(endNumStr);
                            }
                        }
                        RuleDetail plan = new RuleDetail(ruleName,type,ruleFormatName,numValue,charValue,numLength,numStep,variateFormatName,variateTypeName,startNum,endNum);
                        int m = i + 1;
                        //将excel中的每一行数据存储进行检查
                        String result = ruleDetailService.checkNoRepeatExcel(plan);
                        if(result!=null){
                            errorDatas.add(ExcelErrorData.getExcelErrorData(i, result));
                            needAdd=false;
                        }

                        if (needAdd) {
                            addProductPlans.add(plan);
                        } else {
                            jsonObject.setStatus(JSONObject.ERROR);
                            jsonObject.setMsg("导入数据中存在异常信息");
                        }

                    }
                    //根据这些来判断是否是中止导入还是跳过继续进行导入
                    if (jsonObject.getStatus().equals(JSONObject.ERROR) && !way) {
                        jsonObject.setMsg(jsonObject.getMsg() + ",中止导入");
                    } else {
                        if (addProductPlans.size() > 0) {
                            try {
                                ruleDetailService.updateListRuleDetail(addProductPlans);
                                //当程序执行到这里时,判断信息是否为空为空的话设置导入成功
                                jsonObject.setMsg(StringUtils.isBlank(jsonObject.getMsg()) ? "导入成功" : jsonObject.getMsg());
                                if ("导入成功".equals(jsonObject.getMsg())) {
                                    jsonObject.setStatus(JSONObject.SUCCESS);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                jsonObject.setMsg("导入失败");
                            }
                        }
                    }
                    //msg.setData(GsonUtil.toJson(errorDatas));
                }
            }
        }
        jsonObject.setData(GsonUtil.toJson(errorDatas));
        return JSONObject.build(jsonObject.getStatus(),jsonObject.getMsg(),errorDatas);
    }

}
